#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ls (o<<1)
#define rs (o<<1 | 1)
const int N = 2e5+10;
const int MOD = 998244353;

int n,q;
int a[N], t[N<<2], add[N<<2], mul[N<<2];

int mo(int x){ return (x%MOD+MOD)%MOD; }

// void update(int s, int e, int o , int x){
//     t[o] += (e-s+1) * x;
//     lz[o] += x;
// }

// for each node in [s,e], *k + x 
void update(int s, int e, int o, int k, int x){
    t[o] = mo( mo(t[o]*k) + mo(x*(e-s+1)) );
    mul[o] = mo(mul[o]*k%MOD);
    add[o] = mo(mo(add[o]*k)+x);
}

void pushup( int o ){
    t[o] = mo(t[ls] + t[rs]);
}

void build(int s=1, int e=n, int o=1){
    mul[o] = 1;
    if (s==e) {
        t[o] = mo(a[s]);
        return;
    }

    int mid = (s+e) / 2;
    build(s,mid,ls);
    build(mid+1,e,rs);
    pushup(o);
}

void pushdown(int s, int e, int o){
    int mid = (s+e) / 2;
    update(s,mid,ls,mul[o],add[o]);
    update(mid+1,e,rs,mul[o],add[o]);

    mul[o] = 1;
    add[o] = 0;
}

void modify(int l, int r, int k, int x, int s=1, int e=n, int o=1){
    if ( l<=s && e<=r ){
        update(s,e,o,k,x);
        return;
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    if ( l<=mid ) modify(l,r,k,x,s,mid,ls);
    if ( mid+1<=r ) modify(l,r,k,x,mid+1,e,rs);
    pushup(o);
}

int query(int l, int r, int s=1, int e=n, int o=1){
    if ( l<=s && e<=r ){
        return mo(t[o]);
    }

    pushdown(s,e,o);
    int res = 0;
    int mid = (s+e) / 2;
    if (l<=mid) res = mo(res+query(l,r,s,mid,ls));
    if (mid+1<=r) res = mo(res+query(l,r,mid+1,e,rs));
    pushup(o);
    return res;
}

signed main(){
    cin >> n >> q;
    for ( int i=1; i<=n; i++ ) cin >> a[i];
    build();


    while(q--){
        int op; cin >> op;
        if ( op==4 ){
            int l,r; cin >> l >> r;
            cout << query(l,r) << '\n';
        } else if ( op==1 ){
            int l,r,x; cin >> l >> r >> x;
            modify(l,r,1,x);
        } else if ( op==2 ){
            int l,r,x; cin >> l >> r >> x;
            modify(l,r,x,0);
        } else if ( op==3 ){
            int l,r,x; cin >> l >> r >> x;
            modify(l,r,0,x);
        } 
    }

    return 0;
}